package io.renren.common.utils;

import java.math.BigDecimal;
import java.text.NumberFormat;

/**
 * 货币工具类
 * 该工具类提供了普通数值和货币形式转换的方法、人民币转成大写方法
 *
 */
public class CurrencyUtil {

    private CurrencyUtil() {
        // 这个类不能外部实例化
    }

    private static final String CN_NEGATIVE = "负";
    private static final String CN_ZEOR_FULL = "零圆整";

    /**
     * 数值转换成金额形式(string参数)
     *
     * @param d
     * @return
     */
    public static String convertToThreeForm(String d) {
        NumberFormat nf = NumberFormat.getInstance();
        return nf.format(new BigDecimal(d).doubleValue());
    }

    /**
     * 数值转换成金额形式(double参数)
     *
     * @param d
     * @return
     */
    public static String convertToThreeForm(double d) {
        return convertToThreeForm(String.valueOf(d));
    }

    /**
     * 金额形式转换成数值
     *
     * @param d
     * @return
     * @throws Exception
     */
    public static BigDecimal convertToNum(String d) throws Exception {
        NumberFormat nf = NumberFormat.getNumberInstance();
        return new BigDecimal(String.valueOf(nf.parse(d)));
    }

    /**
     * 人民币转成大写(BigDecimal_防止浮点型数据最后一位失精问题。) 如果是负数，那么会在结果前加上负
     *
     * @param str
     * @return
     */
    public static String rmbToBig_2(String str) {
        BigDecimal value;
        try {
            value = new BigDecimal(str.trim());
        } catch (Exception e) {
            return null;
        }
        // 返回值:-1-表示负数;0-表示0;1-表示正数
        int signum = value.signum();
        if (signum == 0) {
            return CN_ZEOR_FULL;
        } else {
            String signNumStr = "";
            if (signum < 0) {
                signNumStr = CN_NEGATIVE;
                value = value.abs();
            } else {
                signNumStr = "";
            }

            char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示
            char[] vunit = { '万', '亿' }; // 段名表示
            char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示
            // 四舍五入保存两位小数
            value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
            String valStr = String.valueOf(value); // 转化成字符串
            String head = valStr.split("\\.")[0]; // 取整数部分
            String rail = valStr.split("\\.")[1]; // 取小数部分

            String prefix = ""; // 整数部分转化的结果
            String suffix = ""; // 小数部分转化的结果
            // 处理小数点后面的数
            if (rail.equals("00")) { // 如果小数部分为0
                suffix = "整";
            } else {
                if (rail.charAt(0) == '0') {
                    suffix = digit[rail.charAt(1) - '0'] + "分"; // 把分转化出来
                } else if (rail.charAt(1) == '0') {
                    suffix = digit[rail.charAt(0) - '0'] + "角"; // 把角转化出来
                } else {
                    suffix = digit[rail.charAt(0) - '0'] + "角" + digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来
                }
            }
            boolean preZero = true;
            int hang = 0;
            int lie = 0;
            char[] chDig = head.toCharArray();
            int len = chDig.length;
            if (len % 4 != 0) {
                hang = len / 4;
                lie = len % 4 - 2;
            } else {
                hang = len / 4 - 1;
                lie = 2;
            }
            try {
                for (int i = 0; i < len - 1; i++) {// 整数部分除了最后一位的所有数
                    if (chDig[i] == '0' && chDig[i + 1] == '0') {
                        preZero = false;
                    } else if (chDig[i] == '0' && chDig[i + 1] != '0') {
                        preZero = true;
                    }
                    if (preZero) {
                        prefix += String.valueOf(digit[chDig[i] - '0']);
                        if (lie >= 0 && chDig[i] != '0') {
                            prefix += String.valueOf(hunit[lie]);
                        }
                    }
                    if (hang > 0 && lie == -1) {
                        prefix += String.valueOf(vunit[hang - 1]);
                        hang--;
                    }
                    lie--;
                    if (lie == -2) {
                        lie = 2;
                    }
                }

                if (chDig[len - 1] != '0') {// 整数部分最后一位数
                    prefix += String.valueOf(digit[chDig[len - 1] - '0']);
                }
                if (prefix.length() > 0) {
                    prefix += '圆'; // 如果整数部分存在,则有圆的字样
                }

                if (prefix.contains("零万") || prefix.contains("零亿")) {
                    prefix = prefix.replaceAll("零万", "万");
                    prefix = prefix.replaceAll("零亿", "亿");
                }

                String result = signNumStr + prefix + suffix;

                return result; // 返回正确表示
            } catch (Exception e) {
                return null;
            }
        }
    }

    public static void main(String[] args) {
        try {
            System.out.println("人民币转换成大写：" + rmbToBig_2("-11000000009.59"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
